Java.util Package এর Iterators এর মাধ্যমে আপনি একটি Collection বা Map এর উপাদানগুলোকে একটি নির্দিষ্ট অর্ডারে বা ধারাবাহিকভাবে ট্রাভার্স (iterate) করতে পারেন। যখন আপনি একটি Collection বা Map এর উপাদান ট্রাভার্স করছেন, তখন এটি গুরুত্বপূর্ণ যে আপনি কোন ধরনের Iterator ব্যবহার করছেন, কারণ কিছু Iterator তে fail-fast এবং কিছুতে fail-safe আচরণ থাকে।
এখানে আমরা আলোচনা করব Fail-fast এবং Fail-safe Iterators এর মধ্যে পার্থক্য এবং তাদের ব্যবহারের ধারণা।
1. Fail-fast Iterator
Fail-fast Iterator এমন একটি Iterator যেটি একটি Collection বা Map এর উপাদান ট্রাভার্স করার সময় যদি সেই Collection অথবা Map পরিবর্তিত হয় (যেমন, উপাদান মুছে ফেলা বা যোগ করা), তাহলে এটি ConcurrentModificationException ছুড়ে দেয়। এর মানে হলো, এটি যখনই শনাক্ত করবে যে সংশ্লিষ্ট সংগ্রহটি পরিবর্তিত হয়েছে, তখনই এটি ত্রুটি (exception) ঘটাবে এবং ব্যবহৃত থ্রেড থামিয়ে দেবে।
Key Characteristics of Fail-fast Iterators:
- এটি
ConcurrentModificationExceptionছুড়ে দেয় যদি Collection বা Map এর উপাদান iterate করার সময় পরিবর্তিত হয়। - Fail-fast Iterators সাধারণত
ArrayList,HashMapএর মতোjava.utilএর বেশিরভাগ ক্লাসে ব্যবহৃত হয়। - এটি thread-safe নয়, অর্থাৎ একাধিক থ্রেড যদি একই সময় Collection বা Map পরিবর্তন এবং ট্রাভার্স করে, তবে
ConcurrentModificationExceptionঘটাতে পারে।
Example of Fail-fast Iterator:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class FailFastIteratorExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");
// Creating an iterator
Iterator<String> iterator = list.iterator();
// Removing an element while iterating
while (iterator.hasNext()) {
String item = iterator.next();
if (item.equals("Banana")) {
list.remove(item); // This will cause ConcurrentModificationException
}
}
}
}
Output:
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967)
at FailFastIteratorExample.main(FailFastIteratorExample.java:15)
Explanation:
- এখানে, আমরা একটি
ArrayListতৈরি করেছি এবং তার মাধ্যমে iterator দিয়ে উপাদান ট্রাভার্স করেছি। যখন আমরাBananaউপাদান মুছে ফেলেছি, তখনConcurrentModificationExceptionঘটেছে কারণ আমরা ট্রাভার্স করার সময় Collection এর উপাদান পরিবর্তন করেছি।
2. Fail-safe Iterator
Fail-safe Iterator এমন একটি Iterator যা Collection বা Map পরিবর্তিত হলেও কোন ধরনের exception ছুড়ে দেয় না। এটি মূলত একটি copy বা snapshot নিয়ে কাজ করে, যার ফলে মূল Collection বা Map-এ কোনো পরিবর্তন হলেও iterator তার copy বা snapshot অনুযায়ী কাজ করে।
Key Characteristics of Fail-safe Iterators:
- এটি ConcurrentModificationException ছুড়ে দেয় না। যখনই Collection বা Map পরিবর্তিত হয়, এটি তার একটি কপি বা snapshot ব্যবহার করে কাজ করে।
- Fail-safe Iterators সাধারণত
java.util.concurrentপ্যাকেজের ক্লাসে (যেমনCopyOnWriteArrayList,CopyOnWriteArraySet) ব্যবহৃত হয়। - এটি thread-safe, অর্থাৎ একাধিক থ্রেড যদি একই সময় Collection পরিবর্তন ও ট্রাভার্স করে, তবে এটি কাজ করবে এবং কোন সমস্যা হবে না।
Example of Fail-safe Iterator:
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.Iterator;
public class FailSafeIteratorExample {
public static void main(String[] args) {
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");
// Creating an iterator
Iterator<String> iterator = list.iterator();
// Removing an element while iterating
while (iterator.hasNext()) {
String item = iterator.next();
if (item.equals("Banana")) {
list.remove(item); // This will not cause any exception
}
}
// Printing the final list
System.out.println("Final List: " + list);
}
}
Output:
Final List: [Apple, Orange]
Explanation:
- এখানে
CopyOnWriteArrayListব্যবহার করা হয়েছে, যা fail-safe iterator সরবরাহ করে। যখন আমরাBananaউপাদানটি মুছে ফেলেছি, এটি কোন ত্রুটি তৈরি করেনি। কারণCopyOnWriteArrayListএকটি snapshot তৈরি করেছে এবং iterator সেই কপির সাথে কাজ করেছে, মূল list এর পরিবর্তন ছাড়াই।
Comparison Between Fail-fast and Fail-safe Iterators
| Aspect | Fail-fast Iterator | Fail-safe Iterator |
|---|---|---|
| Exception on Modification | Throws ConcurrentModificationException when the collection is modified during iteration | Does not throw ConcurrentModificationException. Operates on a snapshot of the collection |
| Thread Safety | Not thread-safe (can cause issues in concurrent environments) | Thread-safe (designed for concurrent environments) |
| Performance | Generally faster because it does not create copies of the collection | Slower because it operates on a copy or snapshot of the collection |
| Use Case | Best for single-threaded environments or when collection is not modified during iteration | Best for multi-threaded environments or when concurrent modifications are required |
| Examples | ArrayList, HashMap | CopyOnWriteArrayList, CopyOnWriteArraySet |
- Fail-fast Iterators: এগুলি সাধারণত Java Collections Framework এর ডিফল্ট iterator এবং এগুলি সাধারণত non-thread-safe থাকে। যখন Collection পরিবর্তিত হয় (যেমন, উপাদান যুক্ত করা বা মুছে ফেলা), তখন
ConcurrentModificationExceptionছুড়ে দেয়। - Fail-safe Iterators: এগুলি thread-safe থাকে এবং Collection এর কপি বা snapshot ব্যবহার করে। এটি
java.util.concurrentপ্যাকেজের মধ্যে পাওয়া যায় এবং একাধিক থ্রেডের মধ্যে Collection পরিবর্তন করার সময় সেগুলির সাথে নিরাপদভাবে কাজ করতে সক্ষম।
যখন thread-safety এবং concurrent modification প্রয়োজন, তখন fail-safe iterator ব্যবহার করা উচিত। অন্যদিকে, যদি আপনি একক থ্রেডে কাজ করেন এবং আপনি চান যে কোনো পরিবর্তন হলে ত্রুটি ঘটুক, তাহলে fail-fast iterator ব্যবহার করতে পারেন।
Read more